package metier;

import java.text.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


/**
 * Classe qui cherche les dates utiles pour l'initialisation d'une année
 * @author barrault
 */
public class CalendrierSaison {

    private Integer annee;
    private Date pchsam15avril;
    private Date precven15juin;
    private Date precsam15sept;
    private Date pchven15oct;
    private Date precsam15juin;
    private Date precven14juil;
    private Date suivsam15aout;
    private Date precven15sept;
    private Date precsam14juil;
    private Date suivven15aout;

    public  SimpleDateFormat dateStandard = new SimpleDateFormat("dd/MM/yyyy");

/**
 * Constructeur du calendrier de la sasion dont l'annee est passé en parametre.
 * Son but est de calculer toutes les dates utiles des différentes saisons d'une année
 * @param annee sur laquelle on va faire l'initialisation
 */
    public CalendrierSaison(Integer annee) {
         
try {

    int operation=0;
    int jour=0;

    pchsam15avril = new Date();
    pchsam15avril = dateStandard.parse("15/04/"+annee);
    jour = ConversionJourtoInt(pchsam15avril);
    operation= ChercheDate(jour, 6, 1);
    pchsam15avril = deplacerDate(pchsam15avril,operation);

    precven15juin = new Date();
    precven15juin = dateStandard.parse("15/06/"+annee);
    jour = ConversionJourtoInt(precven15juin);
    operation= ChercheDate(jour, 5, 2);
    precven15juin = deplacerDate(precven15juin,operation);

    precsam15sept = new Date();
    precsam15sept = dateStandard.parse("15/09/"+annee);
    jour = ConversionJourtoInt(precsam15sept);
    operation= ChercheDate(jour, 6, 2);
    precsam15sept = deplacerDate(precsam15sept,operation);


    pchven15oct = new Date();
    pchven15oct = dateStandard.parse("15/10/"+annee);
    jour = ConversionJourtoInt(pchven15oct);
    operation= ChercheDate(jour, 5, 3);
    pchven15oct = deplacerDate(pchven15oct,operation);
    
    precsam15juin = new Date();
    precsam15juin = dateStandard.parse("15/06/"+annee);
    jour = ConversionJourtoInt(precsam15juin);
    operation= ChercheDate(jour, 6, 2);
    precsam15juin = deplacerDate(precsam15juin,operation);
    
    precven14juil = new Date();
    precven14juil = dateStandard.parse("14/07/"+annee);
    jour = ConversionJourtoInt(precven14juil);
    operation= ChercheDate(jour, 5, 2);
    precven14juil = deplacerDate(precven14juil,operation);
    
    suivsam15aout = new Date();
    suivsam15aout = dateStandard.parse("15/08/"+annee);
    jour = ConversionJourtoInt(suivsam15aout);
    operation= ChercheDate(jour, 6, 3);
    suivsam15aout = deplacerDate(suivsam15aout,operation);
    
    precven15sept = new Date();
    precven15sept = dateStandard.parse("15/09/"+annee);
    jour = ConversionJourtoInt(precven15sept);
    operation= ChercheDate(jour, 5, 2);
    precven15sept = deplacerDate(precven15sept,operation);
    
    precsam14juil = new Date();
    precsam14juil = dateStandard.parse("14/07/"+annee);
     jour = ConversionJourtoInt(precsam14juil);
    operation= ChercheDate(jour, 6, 2);
    precsam14juil = deplacerDate(precsam14juil,operation);
    
    suivven15aout = new Date();
    suivven15aout = dateStandard.parse("15/08/"+annee);
     jour = ConversionJourtoInt(suivven15aout);
    operation= ChercheDate(jour, 5, 3);
    suivven15aout = deplacerDate(suivven15aout,operation);

}
    catch (Exception ex) {
    System.out.println("Erreur d'excution de l'application : "+ex);
    }

    }

    /**
     * Recuperation du numero du jour de la semaine a partir d'une date
     * @param d Date du jour a traduire
     * @return l'entier correstondant au jour de la semaine
     */
    public Integer ConversionJourtoInt(Date d) {
         
       SimpleDateFormat dateJours = new SimpleDateFormat("dd/MM/yyyy");
        dateJours.applyLocalizedPattern("EEEE");
        String a=dateJours.format(d).toString();

       if(a.equalsIgnoreCase("lundi")) {
            return 1;
        }
        if(a.equalsIgnoreCase("mardi")) {
            return 2;
        }
        if(a.equalsIgnoreCase("mercredi")) {
            return 3;
        }
        if(a.equalsIgnoreCase("jeudi")) {
            return 4;
        }
        if(a.equalsIgnoreCase("vendredi")) {
            return 5;
        }
        if(a.equalsIgnoreCase("samedi")) {
            return 6;
        }
        if(a.equalsIgnoreCase("dimanche")) {
            return 7;
        }
        return -99999;
    }
/**
 * Fonction qui va chercher le nombre de jour à faire pour arriver a une autre date
 * @param jour date d' arrivée
 * @param jourfix date de depart
 * @param ope opération a faire
 * ope = 1 jourfix le plus proche
 * ope = 2 jourfix precedent la date
 * ope = 3 jourfix suivant la date
 * @return le nombre d'operation a faire
 */
    public Integer ChercheDate(Integer jour, Integer jourfix, Integer ope) {
        int res=0;
        if(ope==1) {
           if (jour!=jourfix) {
             boolean test= false;
            int i=jour;
             int j=jour;


            while (!test) {
                res=res+1;
                i=(i+1)%7;
                j=(j-1)%7;
                if(i==jourfix) {
                    test=true;
                    return res;
                }
               if(j==jourfix) {
                    test=true;
                    return -res;
                }
         }
        }
        }
       if(ope==2) {
           if(jour!=jourfix) {
               boolean test2=false;
               int i=jour;
               
               res=0;
                    while (!test2) {
                     i=(i-1)%7;
                     if(i==-1) {
                         i=6;
                     }
                      res=res+1;
                   if(i==jourfix) {
                    test2=true;
                    return -res;
                }
                    
                 }
             }
           else return 0;
       }
        
       if(ope==3) {
           if(jour!=jourfix) {
               boolean test3=false;
               int j=jour;
                    while (!test3) {
                        res=res+1;
                     j=(j+1)%7;
                   if(j==jourfix) {
                    test3=true;
                    return res;
                }
                  
         }

        }
           else return 0;
       }
        return 0;
    }

    /**
     * Operation sur les dates
     * @param dateDepartRef date à modifier
     * @param nb_jour_deplacer nombre de jours a ajouter ou a enlever
     * @return la nouvelle date
     */
    public Date deplacerDate(Date dateDepartRef,int nb_jour_deplacer){
    GregorianCalendar calendar = new java.util.GregorianCalendar();
    calendar.setTime( dateDepartRef );
    calendar.add (Calendar.DATE, nb_jour_deplacer);
     return calendar.getTime ();
  }

	public Integer getAnnee() {
		return annee;
	}

	public Date getPchsam15avril() {
		return pchsam15avril;
	}

	public Date getPrecven15juin() {
		return precven15juin;
	}

	public Date getPrecsam15sept() {
		return precsam15sept;
	}

	public Date getPchven15oct() {
		return pchven15oct;
	}

	public Date getPrecsam15juin() {
		return precsam15juin;
	}

	public Date getPrecven14juil() {
		return precven14juil;
	}

	public Date getSuivsam15aout() {
		return suivsam15aout;
	}

	public Date getPrecven15sept() {
		return precven15sept;
	}

	public Date getPrecsam14juil() {
		return precsam14juil;
	}

	public Date getSuivven15aout() {
		return suivven15aout;
	}

	
}

